import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

plt.rcParams['font.family'] = 'SimHei'

# 数据和标签
labels = ['生活用品', '科技产品', '二手车', '家具电器', '卡卷礼包', '运动休闲']
sizes = [8674, 50854, 30537, 29246, 8812, 10263]

# 使用浅色调色板
colors = cm.Pastel1.colors  # 使用 Matplotlib 内置的 Pastel1 调色板

# 突出显示最大的分组
explode = [0, 0.05, 0, 0, 0, 0]  # 'B' 的饼块稍微突出

# 自定义 autopct 函数，去除最小扇形的百分比和原始数据
def autopct_func(pct, sizes):
    absolute = int(pct / 100. * sum(sizes))  # 计算绝对值
    # 获取最小的扇形，去除其百分比和原始数据标注
    if absolute == min(sizes):
        return ''  # 返回空字符串，不显示最小的扇形数据
    return f'{absolute}({pct:.1f}%)'  # 显示其他标签的数值和百分比

# 绘制饼图
fig, ax = plt.subplots(figsize=(6, 6))  # 调整图像大小以避免过大
wedges, texts, autotexts = ax.pie(
    sizes,
    explode=explode,
    labels=labels,
    colors=colors,
    autopct=lambda pct: autopct_func(pct, sizes),  # 使用自定义函数显示原始数据和百分比
    startangle=90,  # 从90度（顶部）开始
    textprops={'fontsize': 10, 'fontweight': 'bold', 'color': 'red'},  # 放大并加粗标签，设置文字颜色为白色
    labeldistance=0.9,  # 标签距离饼图中心的距离，值越小标签越近
    wedgeprops={'edgecolor': 'black', 'linewidth': 0.5},  # 添加边框
)

# 设置图表背景透明
fig.patch.set_alpha(0)  # 背景透明
ax.patch.set_alpha(0)   # 极坐标区域透明

# 手动调整 A 标签的位置，避免重叠
# 获取每个标签的角度
angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist()

# 将 A 的标签向圆心移动，避免与其他标签重叠
angle_A = angles[0]  # A 标签的角度位置
radius_A = 0.6  # A 标签距离圆心更近
ax.text(
    angle_A,  # A 标签的角度
    radius_A * sum(sizes),  # 使标签距离中心更近
    'A',  # 标签内容
    ha='center',  # 水平对齐
    va='center',  # 垂直对齐
    fontsize=14,
    fontweight='bold',
    color='white'  # 设置文本为白色
)

# 添加标题，设置白色字体
plt.title("不同数据的占比情况", fontsize=10, fontweight='bold', color='white')

# 确保饼图为圆形
plt.axis('equal')

# 保存图像到指定路径，设置透明背景
output_path = 'static/img/pie_chart_transparent.png'
plt.savefig(output_path, dpi=160, transparent=True)  # 裁剪图像边框
# plt.savefig(output_path, dpi=600, transparent=True)

# 显示图形
plt.show()

print(f"✅ 图像已保存至 {output_path}")
